// 页面组件通用混入
import { ref, onMounted, onActivated, onBeforeUnmount, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';

/**
 * 为页面组件提供通用的生命周期管理
 * @param {Function} loadData - 数据加载函数
 * @param {Object} options - 配置选项
 */
export function usePageLifecycle(loadData, options = {}) {
  const route = useRoute();
  const router = useRouter();
  
  const {
    autoLoad = true, // 是否自动加载数据
    reloadOnRouteChange = true, // 路由变化时是否重新加载
    delay = 100 // 延迟加载时间（毫秒）
  } = options;

  // 安全的数据加载包装器
  const safeLoadData = async () => {
    try {
      if (typeof loadData === 'function') {
        await loadData();
      }
    } catch (error) {
      console.error('Data loading error:', error);
    }
  };

  // 延迟执行数据加载
  const delayedLoadData = () => {
    if (delay > 0) {
      setTimeout(safeLoadData, delay);
    } else {
      safeLoadData();
    }
  };

  // 组件挂载时加载数据
  onMounted(() => {
    console.log('Page component mounted:', route.path);
    if (autoLoad) {
      delayedLoadData();
    }
  });

  // 组件激活时加载数据（用于 keep-alive）
  onActivated(() => {
    console.log('Page component activated:', route.path);
    if (autoLoad) {
      delayedLoadData();
    }
  });

  // 监听路由变化
  if (reloadOnRouteChange) {
    watch(() => route.path, (newPath, oldPath) => {
      console.log('Route changed from', oldPath, 'to', newPath);
      
      // 只有在页面真正发生变化时才重新加载数据
      if (newPath !== oldPath && autoLoad) {
        delayedLoadData();
      }
    }, { 
      immediate: false // 不立即执行，因为 onMounted 已经处理了初始加载
    });
  }

  // 清理函数
  onBeforeUnmount(() => {
    console.log('Page component unmounted:', route.path);
  });

  return {
    route,
    router,
    safeLoadData,
    delayedLoadData
  };
}

// 页面加载状态管理
export function usePageLoading() {
  const loading = ref(false);
  
  const withLoading = async (asyncFn) => {
    loading.value = true;
    try {
      return await asyncFn();
    } finally {
      loading.value = false;
    }
  };
  
  return {
    loading,
    withLoading
  };
}

export default { usePageLifecycle, usePageLoading };
